package com.brds.netty.io;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * JDK Scheduling API
 *
 * @author galudisu
 */
public class ScheduledExecutorServiceSample {

    /**
     * 在java5之前，任务调度建立在`java.util.Timer`，她以`Thread`为基础，后来的JDK版本提供了`java.util.concurrent`包
     * 它定义了接口`ScheduledExecutorService`。
     */
    public static void main(String[] args) {

        // 1. 创建一个带有10个线程的线程池
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);

        ScheduledFuture<?> future = executor.schedule(
            // 2. 创建一个延迟执行的Runnable
            new Runnable() {
            @Override
            public void run() { //3. 执行内容
                System.out.println("60 seconds later");
            }
        }, 60, TimeUnit.SECONDS);   // 4. 定义其60秒后执行

        // do some thing here
        executor.shutdown();    // 5. 一旦task完成，关闭ScheduledExecutorService，并释放资源
    }

    // ScheduledExecutorService的实现有一些限制，比如需要额外的线程来管理池。如果调度很多task，这会成为性能的瓶颈
    // 采用Netty的`EventLoop`，可以解决这个问题 请查看实例{@link NettyEventLoopScheduled}
}
